package com.briup.Client.gather.Impl;

import com.briup.Client.gather.Gather;
import com.briup.Config.BeanAware;
import com.briup.Config.SmartConfig;
import com.briup.Logger.Impl.LogImpl;
import com.briup.Logger.Log;
import com.briup.entity.Environment;
import org.apache.log4j.Logger;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;


import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;

//不备份
public class GatherImpl implements Gather  {
    private Logger log= Logger.getLogger("com.briup.Client.gather.Impl.GatherImpl");

    //private Log log=new LogImpl();
    //private Log log;

    /**
      * 使用IO流(BufferedReader)读取数据文件中的一行行数据，对数据进行解析(分割)，封装成Environment类的对象
      * 将所有Environment类的对象保存到集合中(ArrayList)
      * @return 存储了若干个Environment对象的集合，Environment对象是对采集数据的封装
     */
    @Override
    public Collection<Environment> gather() {
        log.info("开始采集数据");
        //声明缓存字符输入流
        BufferedReader br = null;
        ArrayList<Environment> list = new ArrayList<>();
        try {
            //定义流
            br=new BufferedReader(new FileReader("D:\\training2\\idea_code\\Smart\\src\\main\\resources\\data-dev"));
            String str;
            //使用流读取每一行信息 一次读一行
            while((str= br.readLine())!=null){
                //以|分割数据,存入数组
                String[] arr = str.split("[|]");
                //将数据封装到Environment对象中
                Environment environment = new Environment();
            //100|101|2|16|1|3|5d606f7802|1|1516323596029.
                //设置发送端id
                environment.setSrcId(arr[0]);
                //设置树莓派系统id
                environment.setDesId(arr[1]);
                //设置实验箱区域模块id(1-8)
                environment.setDevId(arr[2]);
                //设置传感器个数  String类型转int
                environment.setCount(Integer.parseInt(arr[4]));
                //设置指令标号  3接收数据，16发送数据
                environment.setCmd(arr[5]);
                //设置状态标识   默认为1，表示成功
                environment.setStatus(Integer.parseInt(arr[7]));
                //设置采集时间
                environment.setGather_date(new Timestamp(Long.parseLong(arr[8])));

                //判断传感器地址  16---温度、湿度数据  256---光照数据  1280---CO2浓度
                if("16".equals(arr[3])){
                    //温度0--4  湿度4--8
                    //拿到湿度环境对象   温度对象environment 湿度对象humidiv
                    Environment humidiv=copyEnvironment(environment);
                    //温度
                    environment.setName("温度");
                    environment.setSensorAddress(arr[3]);
                    //1.截取前4位字符串
                    String subString=arr[6].substring(0,4);
                    //2.16进制转换为10进制
                    int i=Integer.parseInt(subString,16);
                    //3.数据计算,封装
                    float f=(i*(0.00268127F))-46.85F;
                    environment.setData(f);
                    //添加到集合
                    list.add(environment);

                    humidiv.setName("湿度");
                    humidiv.setSensorAddress(arr[3]);
                    //1.截取前4位字符串
                    String sub=arr[6].substring(4,8);
                    //2.16进制转换为10进制
                    int j=Integer.parseInt(sub,16);
                    //3.数据计算,封装
                    float h=(j*0.00190735F)-6;
                    humidiv.setData(h);
                    list.add(humidiv);

                }else if("256".equals(arr[3])){
                    //采集数据的名称
                    environment.setName("光照强度");
                    //设置模块上传感器地址
                    environment.setSensorAddress(arr[3]);
                    //截取前4位字符串
                    String subString=arr[6].substring(0,4);
                    //16进制转换为10进制
                    int i=Integer.parseInt(subString,16);
                    //隐式转换 小转大
                    environment.setData(i);
                    list.add(environment);
                }else{
                    //采集数据的名称
                    environment.setName("CO2浓度");
                    //设置模块上传感器地址
                    environment.setSensorAddress(arr[3]);
                    environment.setData(Integer.parseInt(arr[6].substring(0,4),16));
                    list.add(environment);
                }
            }
        } catch (FileNotFoundException e) {
            log.error("文件找不到");
        } catch (IOException e) {
            log.error("采集失败.....");
        }finally {
            if(br!=null){
                try {
                    br.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        log.info("采集成功.....");
        return list;

    }
    //将温度环境对象拷贝属性给湿度环境对象，并返回湿度环境对象
    private Environment copyEnvironment(Environment temperature) {
        return new Environment(null,temperature.getSrcId(),temperature.getDesId(),temperature.getDevId(),null,
                temperature.getCount(),temperature.getCmd(),0.0f,temperature.getStatus(),
                temperature.getGather_date());

    }

//    @Override
//    public void setBean(SmartConfig smartConfig) {
//        //为log赋值
//        log=smartConfig.getLogger();
//
//    }
}
